package packLigaDeFutbol;

import java.util.Calendar;

/**
 * @author jonatanperez
 */

public class Jornada {
	//ATRIBUTOS
	private int id;
	private int numJornada;
	private int idTemporada;
	private Calendar fecha;
	private ListaPartidos listaPartidos = new ListaPartidos();

	//CONSTRUCTORA
	public Jornada(int pNumJornada, Calendar pFecha) {
		numJornada = pNumJornada;
		fecha = pFecha;
	}
	
	//METODOS
	public int getID() {
		return this.id;
	}
	
	public void setID(int idJornada) {
		this.id = idJornada;	
	}
	
	public void setIdTemporada(int pIdTemporada) {
		this.idTemporada = pIdTemporada;
	}
	
	public int getNumJornada() {
		return this.numJornada;
	}
	
	public Calendar getFecha() {
		return this.fecha;
	}
	
	public int getIdTemporada() {
		return this.idTemporada;
	}
	
	public ListaPartidos getListaPartidos() {
		return listaPartidos;
	}

	//Añade un partido a la Jornada
	public void anadirPartido(Partido pPartido){
		if(!this.getListaPartidos().esta(pPartido)){
			this.getListaPartidos().anadirPartido(pPartido);
		}
		else{
			System.out.println("ERROR: No puedes añadir dos partidos iguales en la misma jornada");
		}
	}
	
	//Realiza la combinacion de partidos de la primera jornada de la liga
	public void sortearPrimeraJornada(ListaEquipos pListaEquipos) {
		int i;
		Equipo local, visitante;
		
		for (i = 0; i < pListaEquipos.getTamano()/2; i++){
			local = pListaEquipos.getEquipoPos(i);
			visitante = pListaEquipos.getEquipoPos(i+(pListaEquipos.getTamano()/2));
			Partido partido = new Partido(local,visitante);
			this.getListaPartidos().anadirPartido(partido);
		}
	}

	//Devuelve el equipo comodin para poder realizar la combinacion de partidos de las jornadas
	public Equipo getComodin(){  // Devuelve el equipo comodin
		Equipo comodin;
		Partido partido;
		if(this.getNumJornada() % 2 != 0) {
			partido = this.getListaPartidos().get(this.getListaPartidos().getTamano()-1);
			comodin = partido.getLocal(); // El equipo comodin es el local del �ltimo partido de la jornada
		} else {
			partido = this.getListaPartidos().get(0);
			comodin = partido.getVisitante();
		}
		return comodin;
	}
	
	public Equipo getPrimerLocal(){  // Devuelve el primer equipo que juega como local en la jornada
		Partido partido;
		partido = this.getListaPartidos().get(0);
		return partido.getLocal();
	}
	
	public Equipo getSegundoLocal(){  // Devuelve el segundo equipo que juega como local en la jornada
		Partido partido;
		partido = this.getListaPartidos().get(1);
		return partido.getLocal();
	}
	
	//Devuelve el primer equipo que juega como visitante en la jornada
	public Equipo getPrimerVisitante(){  // Devuelve el primer equipo que juega como visitante en la jornada
		Partido partido;
		partido = this.getListaPartidos().get(0);
		return partido.getVisitante();
	}
	
	//Realiza la combinacion de partidos de las 18  jornadas restantes de la ida de la liga
	public Jornada inicializarSiguienteJornada(int pNumEquiposParticipantes, int numJornada, Jornada pJornadaAnterior){
		Equipo local,visitante,comodin;
		
		int j;
		if (!esPar(numJornada-1)){     // i==1 -> jornada 2 (par)
			visitante = pJornadaAnterior.getComodin();   // Primer paso es localizar el Equipo comodin. 
			//El equipo comodin es el que jugaba como local en la  anterior jornada en último lugar. Ahora pasa a jugar el primero como visitante.
			local = pJornadaAnterior.getPrimerVisitante();
				
			Partido partido1 = new Partido (local, visitante); // Primer partido de la jornada par.
			this.anadirPartido(partido1);
			
			//Para ir añadiendo los 9 partidos restantes de a jornada.
			for (j = 1; j < pNumEquiposParticipantes/2; j++) {
				visitante = pJornadaAnterior.getLocal(j-1);
				local = pJornadaAnterior.getVisitante(j);
				Partido partido = new Partido(local,visitante);
				this.anadirPartido(partido);	
			}
		} else {    // i==2 jornada 3 (impar)
			// En este caso el comodin se queda en la posición original
			local = pJornadaAnterior.getPrimerLocal();
			visitante = pJornadaAnterior.getSegundoLocal();
			Partido partido1 = new Partido(local,visitante);  // Primer partido de la jornada impar.
			this.anadirPartido(partido1);
			
			// Para ir añadiendo los 8 partidos siguientes. Todas menos la primera y ultima jornada
			for (j = 1; j < (pNumEquiposParticipantes/2) - 1; j++) {
				local = pJornadaAnterior.getVisitante(j);  
				visitante = pJornadaAnterior.getLocal(j+1);
				Partido partido = new Partido(local,visitante);
				this.anadirPartido(partido);		
			}
			// Último partido de la jornada
			local = pJornadaAnterior.getComodin();
			visitante = pJornadaAnterior.getVisitante(pJornadaAnterior.getListaPartidos().getTamano()-1);
			Partido partido10 = new Partido(local,visitante);
			this.anadirPartido(partido10);
		}
		return this;
	}

	// Devuelve el equipo que juega como local en la posicion indicada.
	private Equipo getLocal(int i){
		Partido partido;
		partido = this.getListaPartidos().get(i);
		return partido.getLocal();	
	}
	
	// Devuelve el equipo que juega como visitante en la posici�n indicada.
	private Equipo getVisitante(int i){
		Partido partido = null;
		partido = this.getListaPartidos().get(i);
		return partido.getVisitante();	
	}
	
	//Devuelve true si el numero introducido es par
	private boolean esPar(int numero){
	    if (numero%2==0) return true; else return false;
	}
	
	//Devuelve true si el numero introducido es par
	public boolean esPar(){
		boolean par;
	    if(this.getNumJornada() % 2 == 0) {
	    	par = true;
	    }else{
	    	par = false;
	    }
	    return par;
	}
}